<!DOCTYPE html>
<html lang="zh-cn">

<head>
<meta charset="utf-8" />
<meta name="author" content="TianShangXing" />
<meta name="description" content="Personal blog." />
<meta name="keywords" content="blog, tech" />
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<meta name="generator" content="Hugo 0.68.3" />

<link rel="canonical" href="https://tianshangxing.gitee.io/myblog/blog/%E9%92%89%E9%92%89%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/">
<meta property="og:title" content="钉钉三方登录" />
<meta property="og:description" content="钉钉（DingTalk） 是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台，提供PC版，Web版和手机版，支持手机和电脑间文件互传。
钉钉因中国企业而生，帮助中国企业通过系统化的解决方案（微应用），全方位提升中国企业沟通和协同效率。
这里我们使用Django来集成一下钉钉的三方账号登录，首先登录钉钉开发平台： https://open-dev.dingtalk.com/
在移动应用中选择登录
创建一个网站应用，其中有用的信息是appid,appsecret，还有回调网址
随后，查看官方文档，查看如何构造登录url: https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6
这里我们用django的视图来操作
# 构造钉钉登录url def ding_url(request): appid = &#39;dingoaukgkwqknzjvamdqh&#39; redirect_uri = &#39;http://localhost:8000/dingding_back/&#39; return redirect(&#39;https://oapi.dingtalk.com/connect/qrconnect?appid=&#39; &#43; appid &#43;&#39;&amp;response_type=code&amp;scope=snsapi_login&amp;state=STATE&amp;redirect_uri=&#39; &#43; redirect_uri) 然后访问: http://localhost:8000/ding_url，就可以进行扫码
随后，钉钉会将code返回到回调网址中，查看官方文档，只有java和php的sdk，并没有python的
怎么办，没关系，自己写，逻辑很简单，将时间戳，秘钥进行hmac加密即可
import time import hmac import base64 from hashlib import sha256 import urllib import json # 构造钉钉回调方法 def ding_back(request): # 获取code code = request.GET.get(&quot;code&quot;) t = time.time() # 时间戳 timestamp = str((int(round(t * 1000)))) appSecret =&#39;ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160&#39; # 构造签名 signature = base64." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://tianshangxing.gitee.io/myblog/blog/%E9%92%89%E9%92%89%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/" />
<meta property="article:published_time" content="2020-04-02T19:13:18+08:00" />
<meta property="article:modified_time" content="2020-04-02T19:13:18+08:00" />

<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="钉钉三方登录"/>
<meta name="twitter:description" content="钉钉（DingTalk） 是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台，提供PC版，Web版和手机版，支持手机和电脑间文件互传。
钉钉因中国企业而生，帮助中国企业通过系统化的解决方案（微应用），全方位提升中国企业沟通和协同效率。
这里我们使用Django来集成一下钉钉的三方账号登录，首先登录钉钉开发平台： https://open-dev.dingtalk.com/
在移动应用中选择登录
创建一个网站应用，其中有用的信息是appid,appsecret，还有回调网址
随后，查看官方文档，查看如何构造登录url: https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6
这里我们用django的视图来操作
# 构造钉钉登录url def ding_url(request): appid = &#39;dingoaukgkwqknzjvamdqh&#39; redirect_uri = &#39;http://localhost:8000/dingding_back/&#39; return redirect(&#39;https://oapi.dingtalk.com/connect/qrconnect?appid=&#39; &#43; appid &#43;&#39;&amp;response_type=code&amp;scope=snsapi_login&amp;state=STATE&amp;redirect_uri=&#39; &#43; redirect_uri) 然后访问: http://localhost:8000/ding_url，就可以进行扫码
随后，钉钉会将code返回到回调网址中，查看官方文档，只有java和php的sdk，并没有python的
怎么办，没关系，自己写，逻辑很简单，将时间戳，秘钥进行hmac加密即可
import time import hmac import base64 from hashlib import sha256 import urllib import json # 构造钉钉回调方法 def ding_back(request): # 获取code code = request.GET.get(&quot;code&quot;) t = time.time() # 时间戳 timestamp = str((int(round(t * 1000)))) appSecret =&#39;ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160&#39; # 构造签名 signature = base64."/>


<meta itemprop="name" content="钉钉三方登录">
<meta itemprop="description" content="钉钉（DingTalk） 是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台，提供PC版，Web版和手机版，支持手机和电脑间文件互传。
钉钉因中国企业而生，帮助中国企业通过系统化的解决方案（微应用），全方位提升中国企业沟通和协同效率。
这里我们使用Django来集成一下钉钉的三方账号登录，首先登录钉钉开发平台： https://open-dev.dingtalk.com/
在移动应用中选择登录
创建一个网站应用，其中有用的信息是appid,appsecret，还有回调网址
随后，查看官方文档，查看如何构造登录url: https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6
这里我们用django的视图来操作
# 构造钉钉登录url def ding_url(request): appid = &#39;dingoaukgkwqknzjvamdqh&#39; redirect_uri = &#39;http://localhost:8000/dingding_back/&#39; return redirect(&#39;https://oapi.dingtalk.com/connect/qrconnect?appid=&#39; &#43; appid &#43;&#39;&amp;response_type=code&amp;scope=snsapi_login&amp;state=STATE&amp;redirect_uri=&#39; &#43; redirect_uri) 然后访问: http://localhost:8000/ding_url，就可以进行扫码
随后，钉钉会将code返回到回调网址中，查看官方文档，只有java和php的sdk，并没有python的
怎么办，没关系，自己写，逻辑很简单，将时间戳，秘钥进行hmac加密即可
import time import hmac import base64 from hashlib import sha256 import urllib import json # 构造钉钉回调方法 def ding_back(request): # 获取code code = request.GET.get(&quot;code&quot;) t = time.time() # 时间戳 timestamp = str((int(round(t * 1000)))) appSecret =&#39;ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160&#39; # 构造签名 signature = base64.">
<meta itemprop="datePublished" content="2020-04-02T19:13:18&#43;08:00" />
<meta itemprop="dateModified" content="2020-04-02T19:13:18&#43;08:00" />
<meta itemprop="wordCount" content="94">



<meta itemprop="keywords" content="" />

<link rel="stylesheet" href="https://tianshangxing.gitee.io/myblog/css/layout.css" />


<link rel="stylesheet" href="https://tianshangxing.gitee.io/myblog/css/default-dark.css" />




<title>


     钉钉三方登录 

</title>

</head>


<body>
<div class="main">
<header>

<div class="header-bar">

  <nav>
    <div class="siteTitle">
      <a href="https://tianshangxing.gitee.io/myblog">TianShangXing&#39;s Blog</a>
    </div> 

    
    
    <a class="nav-item" href="https://tianshangxing.gitee.io/myblog/blog/"><div class="nav-item-title">Blogs</div></a>
    
    <a class="nav-item" href="https://tianshangxing.gitee.io/myblog/resume/"><div class="nav-item-title">Resume</div></a>
    

  </nav>

  
<div class="social-links-header">

  
  <a href="mailto:tian_shang_xing@foxmail.com"><div class="social-link">email</div></a>
  

  
  <a href="https://github.com/TianShangXing" target="_blank"><div class="social-link">gh</div></a>
  

  

  

  
  <a href="https://www.linkedin.com/in/%e6%98%9f%e4%bc%b8-%e5%88%98-b7b7321a6" target="_blank"><div class="social-link">in</div></a>
  

</div>


</div>


</header>


<article class="post">
    <h1 class="title"> 钉钉三方登录 </h1>
    <div class="content"> <p><strong>钉钉（DingTalk）</strong> 是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台，提供PC版，Web版和手机版，支持手机和电脑间文件互传。</p>
<p>钉钉因中国企业而生，帮助中国企业通过系统化的解决方案（微应用），全方位提升中国企业沟通和协同效率。</p>
<p>这里我们使用Django来集成一下钉钉的三方账号登录，首先登录钉钉开发平台： <a href="https://open-dev.dingtalk.com/">https://open-dev.dingtalk.com/</a></p>
<p>在移动应用中选择登录</p>
<p><img src="https://v3u.cn/v3u/Public/js/editor/attached/image/20191221/20191221095402_74481.png" alt=""></p>
<p>创建一个网站应用，其中有用的信息是appid,appsecret，还有回调网址</p>
<p><img src="https://v3u.cn/v3u/Public/js/editor/attached/image/20191221/20191221095537_44738.png" alt=""></p>
<p>随后，查看官方文档，查看如何构造登录url: <a href="https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6">https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6</a></p>
<p>这里我们用django的视图来操作</p>
<pre><code># 构造钉钉登录url
def ding_url(request):
    appid = 'dingoaukgkwqknzjvamdqh'
    redirect_uri = 'http://localhost:8000/dingding_back/'

    return redirect('https://oapi.dingtalk.com/connect/qrconnect?appid=' + appid +'&amp;response_type=code&amp;scope=snsapi_login&amp;state=STATE&amp;redirect_uri=' + redirect_uri)
</code></pre><p>然后访问: http://localhost:8000/ding_url，就可以进行扫码</p>
<p><img src="https://v3u.cn/v3u/Public/js/editor/attached/image/20191221/20191221100217_14450.png" alt=""></p>
<p>随后，钉钉会将code返回到回调网址中，查看官方文档，只有java和php的sdk，并没有python的</p>
<p><img src="https://v3u.cn/v3u/Public/js/editor/attached/image/20191221/20191221100604_41675.png" alt=""></p>
<p>怎么办，没关系，自己写，逻辑很简单，将时间戳，秘钥进行hmac加密即可</p>
<pre><code>import time
import hmac
import base64
from hashlib import sha256
import urllib
import json

# 构造钉钉回调方法
def ding_back(request):

    # 获取code
    code = request.GET.get(&quot;code&quot;)

    t = time.time()
    
    # 时间戳
    timestamp = str((int(round(t * 1000))))
    appSecret ='ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160'

    # 构造签名
    signature = base64.b64encode(hmac.new(appSecret.encode('utf-8'),timestamp.encode('utf-8'), digestmod=sha256).digest())
    
    # 请求接口，换取钉钉用户名
    payload = {'tmp_auth_code':code}
    headers = {'Content-Type': 'application/json'}
    res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature='+urllib.parse.quote(signature.decode(&quot;utf-8&quot;))+&quot;&amp;timestamp=&quot;+timestamp+&quot;&amp;      accessKey=dingoaukgkwqknzjvamdqh&quot;,data=json.dumps(payload),headers=headers)

    res_dict = json.loads(res.text)
    print(res_dict)
    return HttpResponse(res.text)
</code></pre><p>访问一下，可以看到已经显示出了钉钉的用户名</p>
<p>就是这么简单，最后附上项目地址： <a href="https://github.com/TianShangXing/mydjango">https://github.com/TianShangXing/mydjango</a></p>
 </div>
    <footer class="post-footer">

  <div class="post-footer-data">
            
<div class="tags">
  
</div>

    <div class="date"> 2020-04-02 </div>
    
  </div>
</footer>



</article>

  <footer>

  <div class="social-links-footer">

  
  <a href="mailto:tian_shang_xing@foxmail.com"><div class="social-link">Email</div></a>
  

  
  <a href="https://github.com/TianShangXing" target="_blank"><div class="social-link">GitHub</div></a>
  

  

  

  
  <a href="https://www.linkedin.com/in/%e6%98%9f%e4%bc%b8-%e5%88%98-b7b7321a6" target="_blank"><div class="social-link">LinkedIn</div></a>
  

  <div class="social-link">
  <a href="https://tianshangxing.gitee.io/myblog/index.xml" target="_blank">RSS</a>
  </div>

</div>


  <div class="copyright"> Copyright (c) 2020, all rights reserved. </div>

  <div class="poweredby">
    Powered by <a href="https://gohugo.io/">Hugo</a>.
  </div>

  </footer>

</div> 

</body>
</html>

